home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 April / EnigmA AMIGA RUN 06 (1996)(G.R. Edizioni)(IT)[!][issue 1996-04][Skylink CD V].iso / internet / others / spoolwatch.lha / SpoolWatch / Src / SpoolWindow.c < prev    next >
C/C++ Source or Header  |  1995-10-02  |  7KB  |  286 lines

  1.  
  2. /*
  3.  *    Function    SpoolWindow
  4.  *    Programmer    N.d'Alterio
  5.  *    Date        09/09/95
  6.  *
  7.  *  Synopsis:    Opens window (title bar size) with a title that gives
  8.  *        information about the number of files spooled.
  9.  *
  10.  *  Arguments:    struct SWArgs *swa        Prog args structure.
  11.  *        struct FullInfo *mfi        Mail FullInfo structure.
  12.  *        struct FullInfo *nfi        News FullInfo structure.
  13.  *
  14.  *  Returns:    *spoolw_win            Pointer to window opened.
  15.  *        NULL                If error.
  16.  *
  17.  *  Variables:     swin_width            Min window width needed.
  18.  *         swin_height            Min window height needed.
  19.  *         bwin_width            Max window width needed.
  20.  *         bwin_height            Max window height needed
  21.  *         num_mail            Number of mail msgs.
  22.  *         num_news            Number of news msgs.
  23.  *         max_lines            Maximum number of messages.
  24.  *         exit_code            Function return code.
  25.  *        *size_str            Temp string to get width.
  26.  *        *pub_scr            Pointer to public screen.
  27.  *        *spoolw_win            Pointer to window opened.
  28.  *        *blank                String of spaces.
  29.  *         it                IntuiText structure.
  30.  *         tat                Text attribute struct.
  31.  *         backpen            Background pen colour.
  32.  *         textpen            Text pen colour.
  33.  *        *di                Screen drawinfo struct.
  34.  *        *vi                Visual info struct.
  35.  *        *gad                Pointer to gadget.
  36.  *        *gad_list            Pointer to gadgets linked list.
  37.  *         ng                New gadget struct.
  38.  * 
  39.  *  Functions:    OpenLibrary            Opens a library (EXEC)
  40.  *        OpenWindowTags            Opens a window (INT)
  41.  *        LockPubScreen            Locks default public screen (INT)
  42.  *        UnLockPubScreen            Unlocks public screen (INT)
  43.  *        IntuiTextLength            Finds length of string in pixels (INT)
  44.  *
  45.  *  $Id: SpoolWindow.c 2.5 1995/10/02 22:25:17 daltern Exp $
  46.  *
  47.  */
  48.  
  49. #include "SpoolWatch.h"
  50.  
  51. extern struct Library *IntuitionBase;
  52. extern struct GfxBase *GfxBase;
  53. extern struct Library *GadToolsBase;
  54.  
  55. int SpoolWindow( struct SWArgs *swa, struct FullInfo *nfi, struct FullInfo *mfi ) 
  56.  
  57. {
  58.  
  59.   int i;
  60.   int max_lines;
  61.   int exit_code;
  62.  
  63.   int num_mail;
  64.   int num_news;
  65.  
  66.   long swin_width;
  67.   long swin_height;
  68.   long bwin_width;
  69.   long bwin_height;
  70.  
  71.   char *size_str   = "Mail: 000 News: 000\0";
  72.   char blank[FULLINFO_LEN+1];
  73.  
  74.   struct Screen *pub_scr;
  75.   struct Window *spoolw_win;
  76.   
  77.   struct IntuiText it;
  78.  
  79.   struct TextAttr   tat;
  80.  
  81.   ULONG backpen;
  82.   ULONG textpen;
  83.  
  84.   struct DrawInfo *di;
  85.  
  86.   long int gad_width;
  87.   long int gad_height;
  88.  
  89.   struct Gadget    *gad;
  90.   struct Gadget    *gadlist = NULL;
  91.   struct NewGadget  ng;
  92.  
  93.   void           *vi;
  94.  
  95. /*
  96.  *   Find out max files in spooldir.
  97.  */
  98.  
  99.   num_mail = CountSpool( mfi );
  100.   num_news = CountSpool( nfi );
  101.  
  102.   max_lines = (num_news>num_mail) ? num_news : num_mail;
  103.         
  104.   for ( i = 0; i < FULLINFO_LEN; i++ ) blank[i] = ' ';
  105.   blank[FULLINFO_LEN-1] = '\0';
  106.  
  107.  if ( GfxBase = (struct GfxBase *)OpenLibrary( "graphics.library", 37 ) ) {
  108.   if ( IntuitionBase = OpenLibrary( "intuition.library", 37 ) ) {
  109.    if ( GadToolsBase = OpenLibrary( "gadtools.library", 37 ) ) {
  110.  
  111. /*
  112.  *   Find public screen and lock until window has been opened.
  113.  */
  114.  
  115.     if ( pub_scr = LockPubScreen( NULL ) ) {
  116.  
  117. /*
  118.  *  Get width of window needed for title in default font for screen.
  119.  */
  120.  
  121.         it.ITextFont = pub_scr->Font;
  122.         it.IText     = size_str;
  123.  
  124. /*
  125.  *   IntuiTextLength does not seem to work for fixed width fonts so use
  126.  *   a different method for getting window size.
  127.  */
  128.  
  129.         if ( pub_scr->Font->ta_Flags & FPF_PROPORTIONAL ) {
  130.             swin_width  = IntuiTextLength( &it ) + ( pub_scr->FirstGadget->Width * 2 ) + 7;
  131.         } else {
  132.             swin_width  = ( pub_scr->RastPort.Font->tf_XSize * 21 ) + ( pub_scr->FirstGadget->Width * 2 ) + 7;
  133.         }    /* end if */
  134.  
  135.         swin_height = pub_scr->WBorTop + pub_scr->Font->ta_YSize + 1;
  136.  
  137.         if ( di = GetScreenDrawInfo( pub_scr ) ) {
  138.  
  139.             backpen = di->dri_Pens[BACKGROUNDPEN];
  140.             textpen = di->dri_Pens[TEXTPEN];
  141.  
  142.             FreeScreenDrawInfo( pub_scr, di );
  143.  
  144.         }   /* end if di */
  145.  
  146.         tat.ta_Name  = GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name;
  147.           tat.ta_YSize = GfxBase->DefaultFont->tf_YSize;
  148.         tat.ta_Style = GfxBase->DefaultFont->tf_Style;
  149.         tat.ta_Flags = GfxBase->DefaultFont->tf_Flags;
  150.  
  151.         it.FrontPen  = textpen;
  152.         it.BackPen   = backpen;
  153.         it.DrawMode  = JAM2;
  154.         it.LeftEdge  = 0;
  155.         it.TopEdge   = 0;
  156.         it.ITextFont = &tat;
  157.         it.NextText  = NULL;
  158.  
  159.         it.IText     = blank;
  160.  
  161.         gad_width    = IntuiTextLength( &it ) + 8;
  162.         gad_height   = it.ITextFont->ta_YSize + 6;
  163.  
  164.           bwin_width   = IntuiTextLength( &it ) + pub_scr->WBorLeft + pub_scr->WBorRight + 15;
  165.           bwin_height  = ( pub_scr->WBorTop + pub_scr->Font->ta_YSize + 1 ) + pub_scr->WBorBottom + ( it.ITextFont->ta_YSize * (max_lines+2) ) + 15 + gad_height;
  166.  
  167.         if ( vi  = GetVisualInfo( pub_scr, TAG_END ) ) {
  168.  
  169.             gad = CreateContext( &gadlist );
  170.  
  171.             ng.ng_TextAttr   = &tat;
  172.             ng.ng_VisualInfo = vi;
  173.             ng.ng_LeftEdge   = (bwin_width/2)-(gad_width/2);
  174.             ng.ng_TopEdge    = pub_scr->WBorTop + pub_scr->Font->ta_YSize + 6;
  175.             ng.ng_Height     = gad_height;
  176.             ng.ng_Width      = gad_width;
  177.             ng.ng_GadgetText = "News/Mail";
  178.             ng.ng_GadgetID   = 2;
  179.             ng.ng_Flags     = PLACETEXT_IN;
  180.  
  181.             if ( gad = CreateGadget( BUTTON_KIND, gad, &ng, TAG_END ) ) {
  182.  
  183.  
  184. /*
  185.  *   Open the window.
  186.  */
  187.  
  188.                 spoolw_win = OpenWindowTags( 
  189.                     NULL,
  190.                     WA_Left,            swa->win_left,       
  191.                     WA_Top,             swa->win_top,
  192.                     WA_Width,           swin_width,   
  193.                     WA_Height,        swin_height,
  194.                     WA_MinHeight,        swin_height,
  195.                     WA_MinWidth,        swin_width,
  196.                     WA_MaxHeight,        bwin_height,
  197.                     WA_MaxWidth,        bwin_width,
  198.                     WA_AutoAdjust,        TRUE,
  199.                     WA_DragBar,         TRUE,
  200.                     WA_CloseGadget,     TRUE,
  201.                     WA_Gadgets,        gadlist,
  202.                     WA_RMBTrap,        TRUE,
  203.                     WA_SmartRefresh,    TRUE,
  204.                     WA_IDCMP,           IDCMP_CLOSEWINDOW | 
  205.                                 IDCMP_MOUSEBUTTONS |
  206.                                 IDCMP_NEWSIZE |
  207.                                  IDCMP_GADGETUP |
  208.                                     IDCMP_REFRESHWINDOW,
  209.                     WA_Title,           "",
  210.                     WA_ScreenTitle,        SCREEN_TITLE,
  211.                     WA_PubScreen,       pub_scr,
  212.                     WA_DepthGadget,        TRUE,
  213.                                 TAG_END );
  214.  
  215.  
  216. /*
  217.  *   Go into event loop.
  218.  */
  219.  
  220.                 if ( spoolw_win ) {
  221.  
  222.                     GT_RefreshWindow( spoolw_win, NULL );
  223.                     exit_code = HandleEvents( spoolw_win, gad, &it, swa, nfi, mfi );
  224.                     CloseWindow( spoolw_win );
  225.  
  226.                 } else {
  227.  
  228.                     SWError( swa, NULL, "Could not open window" );
  229.                     exit_code = FAIL;
  230.  
  231.                 }   /* end if spoolw_win */
  232.  
  233.                 FreeGadgets( gadlist );
  234.  
  235.             } else {
  236.  
  237.                 SWError( swa, NULL, "Could not create gadget" );
  238.                 exit_code = FAIL;
  239.  
  240.             }   /* end if gad */
  241.  
  242.             FreeVisualInfo( vi );
  243.  
  244.         } else {
  245.  
  246.             SWError( swa, NULL, "Could not get visual info" );
  247.             exit_code = FAIL;
  248.  
  249.         }   /* end if vi */
  250.  
  251.         UnlockPubScreen( NULL, pub_scr );
  252.  
  253.       } else {
  254.         SWError( swa, NULL, "Failed to lock public screen" );
  255.         exit_code = FAIL;
  256.     }  /* end if lock screen */
  257.  
  258.     CloseLibrary( GadToolsBase );
  259.  
  260.    } else {
  261.     SWError( swa, NULL, "Could not open library" );
  262.     exit_code = FAIL;
  263.    }   /* end if GadToolsBase */
  264.  
  265.    CloseLibrary( IntuitionBase );
  266.  
  267.   } else {
  268.     SWError( swa, NULL, "Could not open library" );
  269.        exit_code = FAIL;
  270.   }  /* end if IntuitionBase */
  271.  
  272.   CloseLibrary( (struct Library *)GfxBase );
  273.  
  274.  } else {
  275.     SWError( swa, NULL, "Could not open library" );
  276.     exit_code = FAIL;
  277.  }  /* end if GfxBase */
  278.  
  279.  return exit_code;
  280.  
  281. }   /* end function SpoolWindow */
  282.  
  283. /*========================================================================*
  284.                         END FUNCTION SpoolWindow
  285.  *========================================================================*/
  286.